﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using wne.models;
using wne.models.Filter;


namespace wne.core.Interface
{
    public abstract class DocumentFacade
    {
        
        #region Docs
        /* ----------------- не было понято зачем нужен нам он...
        /// <summary>
        /// возвращает все существующие(живые) документы
        /// может использоваться каждый тик времени для перехода документов по таймеру
        /// метод сложный и часто (возможно) вызываемый, оптимизируйте хорошо
        /// </summary>
        /// <returns></returns>
        public abstract List<Smalldoc> GetFilteredDocsAlive();
        */

        /// <summary>
        /// Метод для старницы "Редактируемые документы"
        /// выводит список документов, которые редактируются данным пользователем
        /// cюда включается поиск по подстроке
        /// </summary>
        /// <param name="pFilter">фильтр</param>
        /// <param name="UserId">айди пользователя, который запрашивает список</param>
        /// <returns></returns>
        public abstract List<Smalldoc> GetFilteredDocs(DocFilter pFilter, int UserId);

        /// <summary>
        /// Метод для старницы "Входящие документы"
        /// выводит список документов, доступных для редактирования данным пользователем
        /// cюда включается поиск по подстроке
        /// </summary>
        /// <param name="pFilter">фильтр</param>
        /// <param name="UserId">айди пользователя, который запрашивает список</param>
        /// <returns></returns>
        public abstract List<Smalldoc> GetFilteredDocsAvailable(DocFilter pFilter, int UserId);

        /// <summary>
        /// Метод для старницы "Обработанные документы"
        /// выводит список документов, обработанных данным пользователем
        /// cюда включается поиск по подстроке
        /// </summary>
        /// <param name="pFilter">фильтр</param>
        /// <param name="UserId">айди пользователя, который запрашивает список</param>
        /// <returns></returns>
        public abstract List<Smalldoc> GetFilteredDocsDone(DocFilter pFilter, int UserId);

        /// <summary>
        /// дает документ по айди из базы, если нет такого, вернуть модель, где айди=-1
        /// учитывает какой пользователь запрашивает документ, на каком этапе существования документа он запрашивается и с какой страницы приходит запрос,
        /// от этого зависит возможность редактировать поля документа на данном шаге.
        /// Если запрос пришел со страницы Обработанные документы, то нет возможности редактирования полей. Если со страницы Редактируемые документы, то зависит от маршрута.
        /// Используется для вывода модели на странице "Просмотр документа".
        /// </summary>
        /// <param name="DocId">айди документа</param>
        /// <param name="UserId">айди пользователя</param>
        /// <param name="CurrPage">Страница, с которой запрашивается документ на просмор: 1 - редактируемые документы; 2 - Обработанные документы.</param>
        /// <returns>возвращает заполненый объект модели документа</returns>
        public abstract DocModel GetDocById(int DocId, int UserId, int CurrPage);

        /// <summary>
        /// создает документ в базе
        /// </summary>
        /// <param name="pDocModel">модель документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract int CreateDoc(DocModel pDocModel);
        /// <summary>
        /// создает документ в базе
        /// </summary>
        /// <param name="pDocModel">модель документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract DocModel StartDoc(DocModel pDocModel);
        /// <summary>
        /// создает документ в базе
        /// </summary>
        /// <param name="pDocModel">модель документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract int CreateDoc2(DocModel pDocModel);

        /// <summary>
        /// сохраняет изменения пользователем пишет их в историю и т.д.
        /// </summary>
        /// <param name="pDocModel">модель документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract int UpdateDoc(DocModel pDocModel);

        /// <summary>
        /// удаляет документ из базы
        /// </summary>
        /// <param name="id">айди документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract int DeleteDoc(int id);

        /// <summary>
        /// посылает документ дальше в зависимости от параметров маршрута.
        /// сохраняется текущая дата, соответствующая приходу документу на следующий этап
        /// </summary>
        /// <param name="id">айди документа</param>
        /// <returns>0 - успех; 1 - некая ошибка;</returns>
        public abstract int DocGo(DocModel doc);




        #endregion

        public abstract Fulldoc GetFullDoc(int id);
        public abstract int AddOutDoc(Fulldoc model);
        public abstract void SaveFileToDoc(int docId, byte[] file, string fileName);
    }
}
